home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 4
/
FM Towns Free Software Collection 4 - Disc 1.iso
/
t_os
/
magrex
/
mag2.asm
next >
Wrap
Assembly Source File
|
1991-10-18
|
3KB
|
213 lines
; mag2.asm 91.03.27
; copyright(c)1991 K.Kurosaki
.386p
code segment dword public ER use32 'CODE'
assume cs:CODE,ds:CODE
mag proc near
mov ebp,esp
mov ebx,[ebp+4] ; 第一パラメータ BASE ADDRESS
mov eax,[ebp+8] ; 第二パラメータ
cmp eax,200
; ja mag02 ; 200より大
cmp eax,0 ; =0
; jne mag04
mag02:
mov eax,1 ; 範囲外は1
mag04:
mov scr_line,eax ; 1回分のスクロール
mov ax,[ebx+8] ; x2
shr ax,3
mov dx,[ebx+4] ; x1
shr dx,3
sub ax,dx
inc ax
mov xloop,ax ; X繰り返し
mov ax,[ebx+10] ; y2
sub ax,[ebx+6] ; y1
inc ax
mov ycnt,ax ; y繰り返し
xor eax,eax
xor ecx,ecx
mov cx,[ebx+4]
and cx,0fff8h
shr cx,1 ; X1/2
mov ax,[ebx+6]
shl eax,9 ; Y1*512
add eax,ecx
mov edi,eax ; VRAMスタートアドレス
push edi
mov edx,[ebx+24] ; ピクセルのオフセット
add edx,ebx
mov ecx,[ebx+28] ; ピクセルのサイズ
mag10:
mov al,[edx]
mov ah,al ; 上位下位ニブルの交換
shl al,4
shr ah,4
or al,ah
mov [edx],al
inc edx
loop mag10
mov edi,offset f_start ; F()領域のクリア
mov ecx,640/4
xor eax,eax
cld
rep stosd
mov ecx,[ebx+16] ; フラグB
add ecx,ebx
mov esi,[ebx+24] ; ピクセル
add esi,ebx
mov eax,[ebx+12] ; フラグA
add eax,ebx
mov ebx,eax
mov ax,104h
mov es,ax ; VRAMのセレクタ
pop edi
xor eax,eax ; eaxの上位は0
mov ah,[ebx] ; フラグA
inc ebx
mov bcnt,8
mag20:
cmp edi,400*512 ; 400ラインかいた?
jb mag22 ; まだ
; call vrammov
push ds
push esi
push ecx
mov cx,104h
mov ds,cx
if 0
mov esi,scr_line
shl esi,9
mov edi,0
mov ecx,400
sub ecx,scr_line
shl ecx,7
else
mov esi,1 ; scr_line
shl esi,9
mov edi,0
mov ecx,(400-1)*512/4
endif
cld
rep movsd
pop ecx
pop esi
pop ds
mov edi,400 ;
sub edi,scr_line
shl edi,9
mag22:
push word ptr xloop
pop word ptr xcnt ; Xの繰り返し数
mov edx,offset f_start ; F()
push edi
mag30:
mov al,[edx] ; F()からもってきて
shl ah,1 ; フラグAを1ビットみて
jnc mag32 ; 0だった
xor al,[ecx] ; フラグB
mov [edx],al
inc ecx
mag32:
inc edx ; F()
dec word ptr bcnt
jne mag34
mov ah,[ebx] ; フラグA
inc ebx
mov bcnt,8
mag34:
push eax
shr al,4 ; 上位ニブル
call pix
pop eax
push eax
call pix ; 下位ニブル
pop eax
dec word ptr xcnt
jne mag30
pop edi
add edi,512
dec word ptr ycnt
jne mag20
ret
mag endp
pix proc near
and al,0fh
je pix10 ; フラグ=0
xor ah,ah
shl ax,2 ; テーブル参照のため
mov eax,vpos[eax] ; VRAMの相対値
mov ax,es:[edi][eax] ; VRAMの値
stosw ; VRAMへ
ret
pix10:
movsw ; ピクセルからVRAMへ
ret
pix endp
vpos dd 0 ; 0
dd -2 ; 1
dd -4 ; 2
dd -8 ; 3
dd -512 ; 4
dd -514 ; 5
dd -1024 ; 6
dd -1026 ; 7
dd -1028 ; 8
dd -2048 ; 9
dd -2050 ; 10
dd -2052 ; 11
dd -4096 ; 12
dd -4098 ; 13
dd -4100 ; 14
dd -8192 ; 15
xloop dw ?
xcnt dw ?
ycnt dw ?
bcnt dw ?
scr_line dd ?
f_start db ?
CODE ends
end